package com.woniu.login.configuration;

import com.woniu.common.entity.AdmEmployee;
import com.woniu.login.service.LoginService;
import org.apache.shiro.authc.*;
import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.crypto.hash.Sha256Hash;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.util.ByteSource;
import org.springframework.context.annotation.Configuration;

@Configuration
public class DbShiroRealm extends AuthorizingRealm {
    // 设置密码盐
    //private static final String encryptSalt = "F12839WhsnnEV$#23b";
    //  注入userService
    private LoginService loginService;

    public DbShiroRealm(LoginService loginService) {
        this.loginService = loginService;
        //	使用SHA-256算法来验证用户的密码。
        //this.setCredentialsMatcher(new HashedCredentialsMatcher(Sha256Hash.ALGORITHM_NAME));
    }

    //	判断当前Realm是否支持处理这个token。如果支持，返回true；否则返回false。
    @Override
    public boolean supports(AuthenticationToken token) {
        System.out.println("进入DbShiroRealm的supports方法");
        //	判断是否为UsernamePasswordToken类型的token
        return token instanceof UsernamePasswordToken;
    }

    //	用于获取与传入令牌相关的认证信息。
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        //	将传入的token转换为UsernamePasswordToken类型，以便能够获取用户名和密码。
        UsernamePasswordToken userpasswordToken = (UsernamePasswordToken)token;
        //	获取用户名
        String username = userpasswordToken.getUsername();
        //	根据用户名查询用户信息
        AdmEmployee admEmployee = loginService.getAdmEmployeeByNumber(username);
        if(admEmployee == null)
            throw new AuthenticationException("用户名或者密码错误");
        //	返回一个SimpleAuthenticationInfo对象，其中包含用户名、加密后的密码、密码盐和Realm的名称。
        SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(admEmployee.getNumber(), admEmployee.getPassword().toCharArray(),""/*ByteSource.Util.bytes(encryptSalt),*/ /*"dbRealm"*/);
        return simpleAuthenticationInfo;
    }

    //	获取与传入主体相关的授权信息。
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
//        //	创建了一个新的SimpleAuthorizationInfo对象，用于存储用户的授权信息。
//        SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
//        //	从PrincipalCollection中获取主要主体，并将其转换为UserDto类型。这个主体通常是在认证阶段设置的，代表当前用户
//        UserDto user = (UserDto) principals.getPrimaryPrincipal();
//        //	获取用户的角色信息，并将其添加到SimpleAuthorizationInfo对象中。如果用户没有角色信息，则从数据库中查询并设置。
//        List<String> roles = user.getRoles();
//        if(roles == null) {
//            roles = userService.getUserRoles(user.getUserId());
//            user.setRoles(roles);
//        }
//        if (roles != null)
//            simpleAuthorizationInfo.addRoles(roles);
//
//        return simpleAuthorizationInfo;
        return null;
    }


}

